package v2;

import org.bson.Document;

import java.lang.reflect.Field;

/**
 * @Author: jiarupc
 * @Date: 2020/12/14
 * @Description:    MongoDb工具类，用于：Java对象与document互转
 */
public class MongoDbUtils {

    // 定义泛型方法：1. 在返回值前，声明泛型参数 <参数名>；2. 传入参数时，指定一个泛型参数
    public static <T> Document obj2Doc(T obj) throws Exception {
        Document doc = new Document();

        // 获取所有字段：通过 getClass() 方法获取 Class 对象，然后获取这个类所有字段
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            // 开放字段操作权限
            field.setAccessible(true);
            // 设置值
            doc.put(field.getName(), field.get(obj));
        }

        return doc;
    }

    // 定义泛型方法：1. 在返回值前，声明泛型参数 <参数名>；2. 传入参数时，通过指定泛型，声明 Class 参数
    public static <T> T doc2Obj(Document doc, Class<T> clazz) throws Exception {
        // 实例化泛型对象
        T obj = clazz.newInstance();

        for (String key : doc.keySet()) {
            // 获取字段
            Field field = clazz.getDeclaredField(key);
            // 开放字段操作权限
            field.setAccessible(true);
            // 设置值
            field.set(obj, doc.get(key));
        }

        return obj;
    }


}
